package cn.goktech.jdkproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

public class ProxyFactory {

    //JDK的动态代理：前提条件，被代理对象要实现接口
    //cglib的动态代理：前提条件是继承，自行研究。。
    //目标对象
    private Object target;

    public ProxyFactory(Object target) {
        this.target = target;
    }

    //最重要的步骤：：获取代理对象
    public Object getProxy() {
        //类加载器ClassLoader loade
        ClassLoader classLoader = target.getClass().getClassLoader();
        //目标对象实现的接口  Class<?>[] interfaces
        Class[] interfaces = target.getClass().getInterfaces();
        //InvocationHandler：处理器接口
        InvocationHandler invocationHandler = new InvocationHandler() {
            @Override
            //object是方法执行返回值
            public Object invoke(Object proxy, Method method, Object[] args) {
                Object result = null;
                try {
                    System.out.println("【前置】日志，方法执行前，方法：" + method.getName() + "参数：" + Arrays.toString(args));
                    //让目标对象执行方法
                    result = method.invoke(target, args);
                    System.out.println("【返回】日志，方法执行后，方法：" + method.getName() + "result：" + result);
                } catch (IllegalAccessException e) {
                    System.out.println("【异常】日志，catch，方法：" + method.getName() + "异常：" + e);
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    System.out.println("【异常】日志，catch，方法：" + method.getName() + "异常：" + e);
                    e.printStackTrace();
                } finally {
                    System.out.println("【后置】日志，finally，方法：" + method.getName() + "result：" + result);
                }
                return result;

            }
        };
        //获取代理对象

        return Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);
    }
}
